package com.txt.util;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.txt.properties.CosProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@Component
public class COSFileUtil {

    @Autowired
    private COSClient cosClient;

    @Autowired
    private CosProperties cosProperties;


    /**
     * 上传文件到 COS
     * @param multipartFile 文件
     * @param key 存储在 COS 中的文件名
     * @return 文件的访问 URL
     */
    public String uploadFileAndGetUrl(MultipartFile multipartFile , String key) throws IOException {
        // 添加默认路径
        key = cosProperties.getDefaultPath() + key;
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(multipartFile.getContentType());
        InputStream inputStream = multipartFile.getInputStream();
        PutObjectRequest putObjectRequest = new PutObjectRequest(cosProperties.getBucketName(), key, inputStream, objectMetadata);
        try {
            PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
            // 获取 ETag
            String eTag = putObjectResult.getETag();
            System.out.println("Uploaded object ETag: " + eTag);
            return cosProperties.getUrl() + "/" + key;
        } catch (CosServiceException e) {
            // 处理服务端异常，例如权限问题、存储桶不存在等
            e.printStackTrace();
            // 可以根据具体情况记录错误信息或返回错误提示给调用者
            throw new RuntimeException("文件上传失败：服务端错误", e);
        } catch (CosClientException e) {
            // 处理客户端异常，例如网络问题、SDK 配置错误等
            e.printStackTrace();
            // 可以根据具体情况记录错误信息或返回错误提示给调用者
            throw new RuntimeException("文件上传失败：客户端错误", e);
        }
    }

    /**
     * 从 COS 下载文件
     * @param key 存储在 COS 中的文件名
     * @param localPath 本地保存路径
     */
    public void downloadFile(String key, String localPath) {
        // 添加默认路径
        key = cosProperties.getDefaultPath() + key;
        java.io.File localFile = new java.io.File(localPath);
        com.qcloud.cos.model.GetObjectRequest getObjectRequest = new com.qcloud.cos.model.GetObjectRequest(cosProperties.getBucketName(), key);
        cosClient.getObject(getObjectRequest, localFile);
    }

    /**
     * 从 COS 删除文件
     * @param key 存储在 COS 中的文件名
     */
    public void deleteFile(String key) {
        // 添加默认路径
        key = cosProperties.getDefaultPath() + key;
        cosClient.deleteObject(cosProperties.getBucketName(), key);
    }

    /**
     * 关闭 COS 客户端
     */
    public void shutdownClient() {
        cosClient.shutdown();
    }
}    